// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Formatting can break multitests, so don't format them.
// dart format off

import "package:expect/async_helper.dart";
import "package:expect/expect.dart";

// Two loop variables
test1() async {
  var r = 0;
  label:
  for (var i = 1,
          j =
      await //# await_in_init: ok
              10;
      i < 10 &&
          j >
      await //# await_in_condition: ok
              -5;
      j--,
      i +=
      await //# await_in_update: ok
          1) {
    if (i <
        await //# await_in_body: ok
            5 ||
        j < -5) {
      continue label;
    }
    r++;
  }
  Expect.equals(5, r);
}

// One loop variable
test2() async {
  var r = 0;
  label:
  for (var i =
     await //# await_in_init: ok
          0;
      i <
     await //# await_in_condition: ok
          10;
      i +=
     await //# await_in_update: ok
          1) {
    if (i <
        await //# await_in_body: ok
        5) {
      continue label;
    }
    r++;
  }
  Expect.equals(5, r);
}

// Variable not declared in initializer;
test3() async {
  var r = 0, i, j;
  label:
  for (i =
      await //# await_in_init: ok
          0;
      i <
      await //# await_in_condition: ok
          10;
      i +=
      await //# await_in_update: ok
          1) {
    if (i <
        await //# await_in_body: ok
        5) {
      continue label;
    }
    r++;
  }
  Expect.equals(5, r);
}

// Nested loop
test4() async {
  var r = 0;
  label:
  for (var i =
      await //# await_in_init: ok
          0;
      i <
      await //# await_in_condition: ok
          10;
      i +=
      await //# await_in_update: ok
          1) {
    if (i <
        await //# await_in_body: ok
        5) {
      for (int i = 0; i < 10; i++) {
        continue label;
      }
    }
    r++;
  }
  Expect.equals(5, r);
}

Future test() async {
  await test1();
  await test2();
  await test3();
  await test4();
}

main() {
  asyncStart();
  test().then((_) => asyncEnd());
}
